using System;
using Sinacor.Infra.UI.Common;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;


namespace Sinacor.UI.Bovespa.Corretagem.Presenter
{
    public class FaixaCorretagem : BasePresenter<IFaixaCorretagem>
    {
        #region Constructor

        /// <summary>
        /// Construtor Padrão
        /// </summary>
        /// <param name="view"></param>
        public FaixaCorretagem(IFaixaCorretagem view)
            : base(view)
        {
            this.Filtro = new Model.Parameter.FiltroFaixaCorretagem();
            this.ListaFaixasCorretagem = new ModelCollection<Model.FaixaCorretagem>();
            this._communicationFaixaCorretagem = new Communication.FaixaCorretagem(this.Session);


        }

        #endregion

        #region Campos
        private Sinacor.UI.Bovespa.Corretagem.Communication.FaixaCorretagem _communicationFaixaCorretagem;
        private Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroFaixaCorretagem _filtro;
        private ModelCollection<Sinacor.UI.Bovespa.Corretagem.Model.FaixaCorretagem> _listaFaixasCorretagem;


        #endregion

        #region Propriedades
        /// <summary>
        /// Filtro
        /// </summary>
        public Model.Parameter.FiltroFaixaCorretagem Filtro
        {
            get { return _filtro; }
            set { _filtro = value; }
        }

        /// <summary>
        /// Lista de Faixas de Corretagem
        /// </summary>
        public ModelCollection<Model.FaixaCorretagem> ListaFaixasCorretagem
        {
            get { return _listaFaixasCorretagem; }
            set { _listaFaixasCorretagem = value; }
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Método AlterarFaixaCorretagem
        /// </summary>
        public bool AlterarFaixaCorretagem(Model.FaixaCorretagem model)
        {
            /*
            Altera uma faixa de corretagem
            */
            try
            {
                if (!this.ValidarFaixaCorretagem(model))
                    return false;

                _communicationFaixaCorretagem.AlterarFaixaCorretagem(model);
                this.View.InformarAlteracaoRealizada();
                return true;
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                return false;
            }
        }

        /// <summary>
        /// Método ExcluirFaixaCorretagem
        /// </summary>
        public bool ExcluirFaixaCorretagem(Model.FaixaCorretagem model)
        {
            /*
            Exclui uma faixa de corretagem
            */
            try
            {
                if (this.View.ConfirmarExclusao())
                {

                    if (model == null)
                        this.View.InformarSelecaoLinhaParaExclusao();

                    Model.Parameter.FiltroFaixaCorretagemChave chave = new Model.Parameter.FiltroFaixaCorretagemChave();
                    chave.DataInicial = model.DataInicial;
                    chave.NumeroFaixa = model.NumeroFaixa;


                    _communicationFaixaCorretagem.ExcluirFaixaCorretagem(chave);
                    this.View.InformaExclusaoRealizada();

                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                return false;
            }
        }

        /// <summary>
        /// Método IncluirFaixaCorretagem
        /// </summary>
        public bool IncluirFaixaCorretagem(Model.FaixaCorretagem model)
        {
            /*
            Inclui uma nova faixa de corretagem
            */
            try
            {
                if (!this.ValidarFaixaCorretagem(model))
                    return false;

                _communicationFaixaCorretagem.IncluirFaixaCorretagem(model);
                this.View.InformarInclusaoRealizada();
                return true;
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                return false;
            }
        }

        /// <summary>
        /// Método Inicializar
        /// </summary>
        public void Inicializar()
        {
            /*
            Inicializa controles da tela
            */
            try
            {
                this.ListaFaixasCorretagem = _communicationFaixaCorretagem.ConsultarFaixasCorretagens(Filtro);
                if (this.ListaFaixasCorretagem.Count == 0)
                    this.View.InformarNenhumRegistroEncontrado();
                this.View.AtualizarFaixasCorretagem();

            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }

        /// <summary>
        /// Método ObterUltimaFaixaCorretagem
        /// </summary>
        private Model.FaixaCorretagem ObterUltimaFaixaCorretagem(DateTime dataInicial)
        {
            /*
            Obtem a ultima faixa de corretagem baseado na data inicial
            */
            try
            {
                Model.Parameter.FiltroFaixaCorretagemChave chave = new Model.Parameter.FiltroFaixaCorretagemChave();
                chave.DataInicial = dataInicial;

                return _communicationFaixaCorretagem.ObterUltimaFaixaCorretagem(chave);

                
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                return null;
            }
        }

        /// <summary>
        /// Método PesquisarFaixasCorretagem
        /// </summary>
        public void PesquisarFaixasCorretagem()
        {
            /*
            Efetua a pesquisa de faixas de corretagem conforme os parametros de fiiltro
            */
            try
            {
                this.ListaFaixasCorretagem = _communicationFaixaCorretagem.ConsultarFaixasCorretagens(Filtro);
                if (this.ListaFaixasCorretagem.Count == 0)
                    this.View.InformarNenhumRegistroEncontrado();
                this.View.AtualizarFaixasCorretagem();
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }
        public void PrepararValoresPadraoNovaFaixa(DateTime dataInicial)
        {
            Model.FaixaCorretagem novaFaixa = this.ObterUltimaFaixaCorretagem(dataInicial);
            if(novaFaixa != null)
                this.View.AtribuirDadosFaixaCorretagem(novaFaixa);
        }

        /// <summary>
        /// Valida uma faixa de corretagem
        /// </summary>
        /// <param name="model">Model.FaixaCorretagem</param>
        /// <returns>bool</returns>
        public bool ValidarFaixaCorretagem(Model.FaixaCorretagem model) 
        {
            if (model.ValorSuperior < model.ValorInferior)
            {
                this.View.InformarValorSuperiorMenorValorInferior();
                return false;
            }
            return true;
        }
        #endregion

    }
}

